package com.example.demo.net;

import lombok.Setter;
import org.springframework.context.ApplicationContext;

/**
 * 网络节点
 * <p>
 * 该类的作用是作为{@link Internet}网络上的网络节点注册到网络上
 * 从而实现节点->网络的通信，网络->节点的通信，节点->节点的通信。
 * 其中网络节点注册到{@link Internet}网络上有两种方式。
 * <p>
 * 第一种（强烈推荐）：NetNode子类结合{@link org.springframework.stereotype.Component}注解。
 * <p>
 * 第二种：NetNode子类结合{@link NetNodeSign}注解，在NetNode子类中已经集成了{@link ApplicationContext}容器。
 *
 * @author ZheMing Liu
 * @since 2021.11.5
 */
public abstract class NetNode implements NetNodeExecutor{

    /**
     * 节点公共网络
     */
    @Setter
    private static Internet internet;

    /**
     * 节点公共spring容器
     */
    @Setter
    protected static ApplicationContext applicationContext;

    /**
     * 构造方法结合{@link org.springframework.stereotype.Component}注解使用
     */
    public NetNode() {
        connectToInternet();
    }

    /**
     * 传输
     *
     * @param netCommand {@link NetCommand}网络命令
     * @return 网络对面节点的返回参数
     */
    protected NetResponse transfer(NetCommand netCommand) {
        return internet.invoke(netCommand);
    }

    /**
     * 是否注册到{@link Internet}公共网络，此方法结合{@link org.springframework.stereotype.Component}注解使用
     */
    private void connectToInternet() {
        internet.NodeConnectToInternet(this.getClass().getSimpleName().replaceAll("NetNode", "").toLowerCase()
                , this);
    }

    /**
     * 将具体节点从{@link Internet}公共网络上清除
     */
    protected void removeToInternet() {
        internet.NoderRemoveToInternet(this.getClass().getSimpleName());
    }
}
